import { ColEx } from '/@/components/TableForm/src/types';
import { ButtonLocation, FormSchema, Rule } from '/@/components/Form';
import { HiddenComponentInfo } from '/@/components/Designer/src/types/index';

/**
 * 表单设计器 返回类型
 */
export interface FormJson {
  //表单总体配置
  config: FormOptionModel;
  //各组件配置
  list: ComponentOptionModel[];
  hiddenComponent: HiddenComponentInfo[];
}

export interface GeneratorFormSchema extends FormSchema {
  key: string;
  group: string;
  name: string;
  icon: string;
}

/**
 * 组件通用配置 实体模型
 */
export interface ComponentOptionModel {
  //key 唯一
  key: string;
  //field name
  bindField: string;
  //table name
  bindTable: string;
  //名称
  label: string;
  //图标
  rules?: Rule[];
  //类型
  type: string;
  //各组件 特殊配置信息  具体配置信息
  options?: ComponentConfigModel;
  //栅格布局的子节点  栅格布局特有
  layout?: LayoutOptionModel[];
  //子表单子节点 子表单特有
  children?: ComponentOptionModel[];
  //range特有
  bindStartTime?: string;
  bindEndTime?: string;
  //隐藏组件特有
  code?: string; //编码
  value?: string; //值
  //界面优先-结构配置 字段备注展示
  typeName?: string; //类型的中文名称
  //是否是子表组件
  isSubFormChild?: boolean;
  //是否是单表组件
  isSingleFormChild?: boolean;
}

/**
 * 表单整体配置 实体模型
 */
export interface FormOptionModel {
  //是否需要隐藏 必填标记
  hideRequiredMark?: boolean;

  //表单尺寸
  size?: 'default' | 'small' | 'large';

  //对齐方式
  layout?: 'vertical' | 'inline' | 'horizontal';

  //label配置
  labelCol?: Partial<ColEx>;

  //对齐方式
  labelAlign?: 'left' | 'right';

  //按钮位置
  buttonLocation?: ButtonLocation;

  //表单形式
  formType?: 'modal' | 'drawer';

  //表单宽度
  formWidth?: number;
}

/**
 * 组件具体配置 实体模型
 */
export interface ComponentConfigModel {
  //绑定表
  table: string;
  //绑定字段
  field: string;
  //宽度
  width?: string;

  // 占位符
  placeholder?: string;
  // 栅格布局占多少列
  col?: number;
  //是否只读
  readonly?: boolean;
  //是否启用
  disabled?: boolean;
  //是否需要label
  isLabel?: boolean;
  showLabel?: boolean;
  //label
  labelWidth?: number;

  //子表单 表格列宽
  columnWidth?: number;
  //默认值
  defaultValue?: any;
  //是否必填
  required?: boolean;
  //是否能够清空
  allowClear: boolean;
  //自定义验证 正则
  rules?: Rule[];

  //事件配置
  events: any;

  //下拉框模式（下拉框框特有） 'default' | 'multiple' | 'tags' | 'combobox'
  mode?: string;
  //是否为远程组件（下拉，单选，多选等组件）
  remote?: boolean;
  //如果是远程组件，代表远程类型
  datasourceType: 'staticData' | 'dic' | 'datasource' | 'api';
  //静态数据默认选择
  defaultSelect?: string | number;
  //datasourceType 是 dic 数据字典项目code
  itemId: string;
  //datasourceType 是datasrouce 存入数据源Id
  sourceId: string;
  //选项 （下拉，单选，多选等组件）
  staticOptions?: any[];
  //  请求地址 （下拉，单选，多选等组件）
  api?: string;
  //api配置信息（下拉，单选，多选等组件）
  apiConfig: any;
  //数据字典配置信息（下拉，单选，多选等组件）
  dicOptions: Array<any>;
  //返回值数据字段 （下拉，单选，多选等组件）
  resultField?: string;
  //显示字段 （下拉，单选，多选等组件）
  labelField?: string;
  //保存字段 （下拉，单选，多选等组件）
  valueField?: string;
  //子字段（树下拉，级联等）
  childrenField?: string;

  //最大输入
  maxLength?: number;
  //是否可以半选(评分特有)
  allowHalf?: boolean;
  //最大值（数字框特有）
  max?: number;
  //最小值（数字框特有）
  min?: number;
  //数值精度（数字框特有）
  precision: number;
  //小数点（数字框特有）
  decimalSeparator: string;
  //最大行 （多行文本框特有）
  maxRow?: number;
  //是否自适应高度(多行文本特有)
  autoSize: boolean;
  // // 是否显示字数(多行文本特有)
  // showCount: boolean;
  //步长（数字框特有）
  step?: number;
  //前缀（input特有）
  addonBefore?: string;
  //后缀（input特有）
  addonAfter?: string;
  //前缀图标（input特有）
  prefix?: string;
  //后缀图标（input特有）
  suffix?: string;

  //分割线文字位置 （分割线特有）
  orientation?: string;

  //tab页签位置（tab特有）
  tabPosition?: string;
  //tab大小 （tab独有）
  tabSize: string;

  //card布局特有
  title?: string;

  //时间组件特有
  format?: string;
  showTime?: boolean;
  //编码规则（编码组件特有）
  autoCodeRule: string;

  //上间距（分割线特有）
  marginTop: number;
  //下间距（分割线特有）
  marginBottom: number;

  //开始占位（时间范围组件特有）
  startTimePlaceholder: string;

  //结束占位（时间范围组件特有）
  endTimePlaceholder: string;

  //按钮高度（按钮组件特有）
  buttonHeight: string;

  //按钮宽度（按钮组件特有）
  buttonWidth: string;

  //选项卡风格（选项卡组件特有）
  type: string;

  //信息体类型（信息体组件特有）
  infoType: number;

  //预加载数据源类型（表格组件特有）
  preloadType: string;

  //是否选择按钮选数据（表格组件特有）
  useSelectButton: boolean;

  //选数据按钮名称（表格组件特有）
  buttonName: string;
  span?: string | number;
  maxlength?: string | number;
  controls?: boolean;
  subTotal?: boolean;

  //预加载数据绑定字段（表格组件特有）
  prestrainField?: string;
}

/**
 * 栅格布局  实体模型
 */
export interface LayoutOptionModel {
  name?: string;
  span: number;
  list: ComponentOptionModel[];
}

/**
 * 前端代码模型
 */
export interface FrontCodeModel {
  listCode: string; // 列表代码
  formCode: string; //表单代码
  apiCode: string; //请求代码
  modelCode?: string; //模型代码
  configJsonCode: string; //配置json模型代码
}

/**
 * 展示代码模型
 */
export interface ShowFrontCodeModel extends FrontCodeModel {
  controllerCode?: string; //控制器代码
  entityCode?: object; //实体类代码
}

//表单尺寸
export enum FormSizeEnum {
  FULL,
  BIG,
  MEDIUM,
  SMALL,
}

export enum AlignTypeEnum {
  LEFT,
  RIGHT,
  CENTER,
}
